package Risk.Moteur;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Serializable;

import java.util.ArrayList;
import java.util.StringTokenizer;

/**
 *  Plateau virtuel
 *  @version    1.0, 07/12/26
 *  @author     Alexandre LIGUORI
 */
public class Plateau implements Serializable {

    // Sebastien : Ajout d'un champ pour securiser la serialisation
    private static final long		serialVersionUID = 11L;
    private ArrayList<Continent>	continents;
    private Jeu				risk;

    /**
     * Constructeur de plateau
     *
     */
    public Plateau(Jeu risk) {
	this.continents = new ArrayList<Continent>();
	this.risk       = risk;
    }

    /**
     * ajoute un continent au plateau
     * @param val continent
     * @return true si reussi, false sinon
     */
    private boolean ajouteContinent(Continent val) {
	return this.continents.add(val);
    }

    /**
     * initialise la liste des continents a partir d un fichier
     * @param fic le chemin du fichier
     */
    public void initialisationContinents(String fic) {
	FileReader	fl    = null;
	BufferedReader	bf    = null;
	String		ligne = null;
	StringTokenizer	stok;
	String		continent = "";
	int		renfort   = 0;
	Continent	continent_TMP;

	try {
	    File	file = new File(fic);

	    fl    = new FileReader(file);
	    bf    = new BufferedReader(fl);
	    ligne = bf.readLine();

	    while (ligne != null) {
		stok          = new StringTokenizer(ligne, " ");
		continent     = stok.nextToken();
		renfort       = Integer.parseInt(stok.nextToken());
		continent_TMP = new Continent(continent, renfort, this);
		continent_TMP.initialisationPays("donnee" + File.separator + "pays_continents.prn");
		ajouteContinent(continent_TMP);
		ligne = bf.readLine();
	    }
	} catch (IOException ex) {
	    ex.printStackTrace();
	} finally {
	    try {
		bf.close();
		fl.close();
	    } catch (IOException ex) {
		ex.printStackTrace();
	    }
	}
    }

    /**
     * initialise la liste des frontieres a partir d un  fichier
     * @param fic le chemin du fichier
     */
    public void intialiseFrontiere(String fic) {
	for (Continent conti : getContinents()) {
	    for (Pays p : conti.getPaysContinent()) {
		p.initialiseVoisins(fic);
	    }
	}
    }

    /**
     * Test si le joueur j possede le continent conti
     * @param j joueur
     * @param conti continent
     * @return true s il possede le continent, false sinon
     */
    public boolean possedeContinent(Joueur j, Continent conti) {
	boolean	test = true;

	for (Pays pa : conti.getPaysContinent()) {
	    if (!pa.getJoueur().getNom().equals(j.getNom())) {
		test = false;
	    }
	}

	return test;
    }

    /**
     * calcul les renforts du joueur j lies a la possesion de continent
     * @param j joueur
     * @return le nombre de renfort que le joueur gagne
     */
    public int renfortContinentPourJoueur(Joueur j) {
	int	renfort = 0;

	for (Continent conti : getContinents()) {
	    if (possedeContinent(j, conti)) {
		renfort += conti.getRenfort();
	    }
	}

	return renfort;
    }

    /**
     * revoie la liste des continents
     * @return liste des continents
     */
    public ArrayList<Continent> getContinents() {
	return continents;
    }

    /**
     * renvoie le nombre de pays pour le joueur j
     * @param j joueur
     * @return nombre de pays que le joueur possede
     */
    public int getNbPaysParJoueur(Joueur j) {
	int	nbPays = 0;

	for (Continent conti : getContinents()) {
	    for (Pays pa : conti.getPaysContinent()) {
		if (pa.getJoueur().getNom().equals(j.getNom())) {
		    nbPays++;
		}
	    }
	}

	return nbPays;
    }

    /**
     * renvoie le l objet pays
     * @param nom nom du pays
     * @return objet du pays
     */
    public Pays getPays(String nom) {
	for (Continent conti : getContinents()) {
	    for (Pays pa : conti.getPaysContinent()) {
		if (pa.getNom().equals(nom)) {
		    return pa;
		}
	    }
	}

	System.out.println("Erreur dans getPays : Pays introuvable");

	return null;
    }

    /**
     * renvoie le jeu virtuel
     * @return le jeu virtuel
     */
    public Jeu getRisk() {
	return risk;
    }
}
